import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.*;

import java.util.stream.Stream;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-08-21
 * Time: 21:39
 */

public class TestJunit {
    public static Stream<Arguments> paramMethod() {
        return Stream.of(
                Arguments.arguments(1, "zhangsan"),
                Arguments.arguments(2, "wangwu")
        );
    }

    @ParameterizedTest
    // csv 文件中, 以一行为单位, 只有一个参数则读取一行中的第一个. 有三个参数则读取一行中的三个参数. 位置强相关
    // 一行结束代表第一组测试用例结束, 传入的参数只能是同类型的.
    // TODO : test01.csv 必须在测试类同一个包下, 并且只能在 resource 里
    @CsvFileSource(resources = "test01.csv")
    void test01(String name1, String name2, String name3 ) {
        System.out.println(name1 +" " + name2 +" "+ name3);
    }

    @ParameterizedTest
    @CsvSource({"1, 2,'',3"}) // 多参数, 位置对应关系, 具体类型由参数列表决定
    void test03(int x, int y, String z,String m) {
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        System.out.println(m);

    }


    // @Test 注解不能喝 @ParameterizedTest 同时使用
    @ParameterizedTest
    // 同样的, 对于参数类型的位置非常敏感
    // 通过方法传入参数数据
    @MethodSource("paramMethod")
     void test02(int id, String name) {
        System.out.println("id: " + id + " , name : " + name);
    }

    @ParameterizedTest
    @ValueSource(ints = {1,2,3})
    void test03(int x) {
        System.out.println(x);
        // 断言相等
        //Assertions.assertEquals(1, x);
        // 断言不相等
        //Assertions.assertNotEquals(1, x);

        String str = "null";  // 此时为字符串 null
        Assertions.assertNull(str); // 但这里断言的就是 null, 并非字符串 null
    }

}
